/**
 * 运费计算系统全局配置
 * 
 * 所有业务相关的常量和配置项都在这里定义
 * 避免在代码中硬编码具体数值，便于维护和修改
 */

// 全局配置对象
window.FREIGHT_CONFIG = {
    
    // ==================== 体积重量转换系数 ====================
    
    /**
     * 体积转换系数
     * 将立方厘米转换为立方米的系数
     * 1立方米 = 1,000,000立方厘米
     */
    volumeConversionFactor: 1000000,
    
    /**
     * 重量转换系数
     * 用于体积重量比和抛重比之间的转换
     * 默认值200，根据业务需求可调整
     */
    weightConversionFactor: 200,
    
    // ==================== 显示格式配置 ====================
    
    /**
     * 抛重比显示精度
     * 抛重比显示时的小数位数
     */
    ratioDisplayDecimals: 1,
    
    /**
     * 重量显示精度
     * 重量计算结果的小数位数
     */
    weightDisplayDecimals: 2,
    
    /**
     * 费用显示精度
     * 运费计算结果的小数位数
     */
    feeDisplayDecimals: 2,
    
    // ==================== 验证规则配置 ====================
    
    /**
     * 最小重量限制（kg）
     * 用户输入的最小重量值
     */
    minWeight: 0.01,
    
    /**
     * 最大重量限制（kg）
     * 用户输入的最大重量值
     */
    maxWeight: 99999,
    
    /**
     * 最小费用限制（元）
     * 运费的最小值
     */
    minFee: 0,
    
    /**
     * 最大费用限制（元）
     * 运费的最大值
     */
    maxFee: 99999,
    
    // ==================== API配置 ====================
    
    /**
     * API请求超时时间（毫秒）
     */
    apiTimeout: 10000,
    
    /**
     * API重试次数
     */
    apiRetryCount: 3,
    
    // ==================== 缓存配置 ====================
    
    /**
     * 区域数据缓存时间（毫秒）
     * 30分钟
     */
    areaCacheExpire: 30 * 60 * 1000,
    
    /**
     * 策略数据缓存时间（毫秒）
     * 15分钟
     */
    strategyCacheExpire: 15 * 60 * 1000,
    
    // ==================== 用户界面配置 ====================
    
    /**
     * 分页大小选项
     */
    pageSizeOptions: [10, 20, 50, 100],
    
    /**
     * 默认分页大小
     */
    defaultPageSize: 10,
    
    /**
     * 区域选择器最大展示数量
     * 避免性能问题
     */
    maxAreaDisplayCount: 1000,
    
    // ==================== 业务规则配置 ====================
    
    /**
     * 抛重比计算公式配置
     * 从后端存储的体积重量比转换为前端显示的抛重比
     */
    volumetricWeightRatioFormula: {
        // 计算公式: displayRatio = (volumetricWeightRatio / volumeConversionFactor * weightConversionFactor)
        description: "抛重比显示值 = (体积重量比 / 体积转换系数 * 重量转换系数)",
        getDisplayRatio: function(volumetricWeightRatio) {
            if (!volumetricWeightRatio || volumetricWeightRatio === 0) {
                return '0.0';
            }
            const ratio = (volumetricWeightRatio / this.volumeConversionFactor * this.weightConversionFactor);
            return ratio.toFixed(this.ratioDisplayDecimals);
        }.bind(window.FREIGHT_CONFIG)
    },
    
    // ==================== 错误消息配置 ====================
    
    /**
     * 错误消息模板
     */
    errorMessages: {
        weightOutOfRange: `重量必须在 {min}kg 到 {max}kg 之间`,
        feeOutOfRange: `费用必须在 {min}元 到 {max}元 之间`,
        invalidNumber: `请输入有效的数值`,
        networkError: `网络请求失败，请检查网络连接`,
        serverError: `服务器错误，请稍后重试`,
        dataNotFound: `未找到相关数据`,
        validationFailed: `数据验证失败`
    },
    
    // ==================== 调试配置 ====================
    
    /**
     * 是否启用调试模式
     * 生产环境应设置为false
     */
    debugMode: false,
    
    /**
     * 日志级别
     * 'debug', 'info', 'warn', 'error'
     */
    logLevel: 'info'
};

// 配置验证函数
window.FREIGHT_CONFIG.validate = function() {
    const config = window.FREIGHT_CONFIG;
    const errors = [];
    
    // 验证基本数值配置
    if (config.volumeConversionFactor < 0) {
        errors.push('体积转换系数不能为负数');
    }
    
    if (config.weightConversionFactor < 0) {
        errors.push('重量转换系数不能为负数');
    }
    
    if (config.minWeight < 0 || config.minWeight >= config.maxWeight) {
        errors.push('重量限制配置无效');
    }
    
    if (config.minFee < 0 || config.minFee >= config.maxFee) {
        errors.push('费用限制配置无效');
    }
    
    if (errors.length > 0) {
        console.error('❌ 运费配置验证失败:', errors);
        return false;
    }
    
    console.log('✅ 运费配置验证通过');
    return true;
};

// 初始化时验证配置
window.FREIGHT_CONFIG.validate();

// 输出配置信息（仅在调试模式下）
if (window.FREIGHT_CONFIG.debugMode) {
    console.log('🔧 运费计算系统配置已加载:', window.FREIGHT_CONFIG);
}/**
 * 运费计算系统全局配置
 * 
 * 所有业务相关的常量和配置项都在这里定义
 * 避免在代码中硬编码具体数值，便于维护和修改
 */

// 全局配置对象
window.FREIGHT_CONFIG = {
    
    // ==================== 体积重量转换系数 ====================
    
    /**
     * 体积转换系数
     * 将立方厘米转换为立方米的系数
     * 1立方米 = 1,000,000立方厘米
     */
    volumeConversionFactor: 1000000,
    
    /**
     * 重量转换系数
     * 用于体积重量比和抛重比之间的转换
     * 默认值200，根据业务需求可调整
     */
    weightConversionFactor: 200,
    
    // ==================== 显示格式配置 ====================
    
    /**
     * 抛重比显示精度
     * 抛重比显示时的小数位数
     */
    ratioDisplayDecimals: 1,
    
    /**
     * 重量显示精度
     * 重量计算结果的小数位数
     */
    weightDisplayDecimals: 4,
    
    /**
     * 费用显示精度
     * 运费计算结果的小数位数
     */
    feeDisplayDecimals: 4,
    
    // ==================== 验证规则配置 ====================
    
    /**
     * 最小重量限制（kg）
     * 用户输入的最小重量值
     */
    minWeight: 0.01,
    
    /**
     * 最大重量限制（kg）
     * 用户输入的最大重量值
     */
    maxWeight: 99999,
    
    /**
     * 最小费用限制（元）
     * 运费的最小值
     */
    minFee: 0,
    
    /**
     * 最大费用限制（元）
     * 运费的最大值
     */
    maxFee: 99999,
    
    // ==================== API配置 ====================
    
    /**
     * API请求超时时间（毫秒）
     */
    apiTimeout: 10000,
    
    /**
     * API重试次数
     */
    apiRetryCount: 3,
    
    // ==================== 缓存配置 ====================
    
    /**
     * 区域数据缓存时间（毫秒）
     * 30分钟
     */
    areaCacheExpire: 30 * 60 * 1000,
    
    /**
     * 策略数据缓存时间（毫秒）
     * 15分钟
     */
    strategyCacheExpire: 15 * 60 * 1000,
    
    // ==================== 用户界面配置 ====================
    
    /**
     * 分页大小选项
     */
    pageSizeOptions: [10, 20, 50, 100],
    
    /**
     * 默认分页大小
     */
    defaultPageSize: 10,
    
    /**
     * 区域选择器最大展示数量
     * 避免性能问题
     */
    maxAreaDisplayCount: 1000,
    
    // ==================== 业务规则配置 ====================
    
    /**
     * 抛重比计算公式配置
     * 从后端存储的体积重量比转换为前端显示的抛重比
     */
    volumetricWeightRatioFormula: {
        // 计算公式: displayRatio = (volumetricWeightRatio / volumeConversionFactor * weightConversionFactor)
        description: "抛重比显示值 = (体积重量比 / 体积转换系数 * 重量转换系数)",
        getDisplayRatio: function(volumetricWeightRatio) {
            if (!volumetricWeightRatio || volumetricWeightRatio === 0) {
                return '0.0';
            }
            const ratio = (volumetricWeightRatio / this.volumeConversionFactor * this.weightConversionFactor);
            return ratio.toFixed(this.ratioDisplayDecimals);
        }.bind(window.FREIGHT_CONFIG)
    },
    
    // ==================== 错误消息配置 ====================
    
    /**
     * 错误消息模板
     */
    errorMessages: {
        weightOutOfRange: `重量必须在 {min}kg 到 {max}kg 之间`,
        feeOutOfRange: `费用必须在 {min}元 到 {max}元 之间`,
        invalidNumber: `请输入有效的数值`,
        networkError: `网络请求失败，请检查网络连接`,
        serverError: `服务器错误，请稍后重试`,
        dataNotFound: `未找到相关数据`,
        validationFailed: `数据验证失败`
    },
    
    // ==================== 调试配置 ====================
    
    /**
     * 是否启用调试模式
     * 生产环境应设置为false
     */
    debugMode: false,
    
    /**
     * 日志级别
     * 'debug', 'info', 'warn', 'error'
     */
    logLevel: 'info'
};

// 配置验证函数
window.FREIGHT_CONFIG.validate = function() {
    const config = window.FREIGHT_CONFIG;
    const errors = [];
    
    // 验证基本数值配置
    if (config.volumeConversionFactor < 0) {
        errors.push('体积转换系数不能为负数');
    }
    
    if (config.weightConversionFactor < 0) {
        errors.push('重量转换系数不能为负数');
    }
    
    if (config.minWeight < 0 || config.minWeight >= config.maxWeight) {
        errors.push('重量限制配置无效');
    }
    
    if (config.minFee < 0 || config.minFee >= config.maxFee) {
        errors.push('费用限制配置无效');
    }
    
    if (errors.length > 0) {
        console.error('❌ 运费配置验证失败:', errors);
        return false;
    }
    
    console.log('✅ 运费配置验证通过');
    return true;
};

// 初始化时验证配置
window.FREIGHT_CONFIG.validate();

// 输出配置信息（仅在调试模式下）
if (window.FREIGHT_CONFIG.debugMode) {
    console.log('🔧 运费计算系统配置已加载:', window.FREIGHT_CONFIG);
}
